#!/bin/bash

# 检查参数数量
if [ $# -lt 2 ] || [ $(($# % 2)) -ne 0 ]; then
    echo "Usage: $0 <ASM_FILE1> <SECTOR1> [<ASM_FILE2> <SECTOR2> ...]"
    exit 1
fi

# 创建输出路径
OUTPUT_DIR="dist"
if [ -d "${OUTPUT_DIR}" ]; then
    echo "清理 ${OUTPUT_DIR} 目录"
    rm -rf "${OUTPUT_DIR}"
fi
mkdir -p "${OUTPUT_DIR}"

IMG_FILE="${OUTPUT_DIR}/boot.img"
# 创建镜像文件
bximage -func=create -fd=1.44M -q ${IMG_FILE}
if [ $? -ne 0 ]; then
    echo "镜像文件创建失败"
    exit 1
fi
echo "镜像文件创建成功: ${IMG_FILE}"

writeDataToImage(){
    BIN_FILE=$1
    SECTOR=$2

    # 获取二进制文件大小
    FILE_SIZE=$(stat -c %s "${BIN_FILE}")

    # 计算需要的扇区数量（每个扇区512字节）
    NUM_SECTORS=$((($FILE_SIZE + 511) / 512))

    # 写入镜像文件到指定扇区
    dd if="${BIN_FILE}" of="${IMG_FILE}" bs=512 count="${NUM_SECTORS}" seek="${SECTOR}" conv=notrunc
    if [ $? -ne 0 ]; then
        echo "Error: ${BIN_FILE} 写入镜像文件失败 (起始扇区: ${SECTOR})"
        exit 1
    fi
    echo "${BIN_FILE} 成功写入到镜像文件 (扇区: ${SECTOR}, 扇区数量: ${NUM_SECTORS})"
}

# 循环处理所有文件
while [[ $# -gt 0 ]]; do
    ASM_FILE=$1
    SECTOR=$2
    shift 2

    # 检查文件扩展名
    EXTENSION="${ASM_FILE##*.}"
    if [ "$EXTENSION" != "asm" ]; then
        echo "${ASM_FILE} 不是一个汇编文件，将直接写入镜像文件"
        writeDataToImage ${ASM_FILE} ${SECTOR}
        continue
    fi

    # 提取路径和文件名
    BASE_NAME=$(basename "${ASM_FILE}" .asm)
    # 生成二进制文件和镜像文件名
    BIN_FILE="${OUTPUT_DIR}/${BASE_NAME}.bin"
    LST_FILE="${OUTPUT_DIR}/${BASE_NAME}.lst"

    # 编译汇编文件
    nasm -f bin -o ${BIN_FILE} -l ${LST_FILE} ${ASM_FILE}
    # 检查编译是否成功
    if [ $? -ne 0 ]; then
        echo "编译失败"
        exit 1
    fi
    echo "编译成功: ${BIN_FILE}"

    # 写入二进制文件到镜像文件
    writeDataToImage ${BIN_FILE} ${SECTOR}
done

# 更新 bochsrc 文件
BOCHSRC_ORIGINAL="../bochsrc"
BOCHSRC_NEW="${OUTPUT_DIR}/bochsrc"

# 复制 bochsrc 文件
cp ${BOCHSRC_ORIGINAL} ${BOCHSRC_NEW}

# 创建一个用于启动 QEMU 的脚本
QEMU_SCRIPT="${OUTPUT_DIR}/run_qemu.sh"
echo "#!/bin/bash" > ${QEMU_SCRIPT}
echo "qemu-system-i386 -fda boot.img" >> ${QEMU_SCRIPT}

# 确保脚本可执行
chmod +x ${QEMU_SCRIPT}

echo "构建完成，bochsrc 已更新"
echo "QEMU 启动脚本已生成: ${QEMU_SCRIPT}"